package com.github.cyf.common.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * @author chenyifan
 * @create 2024-08-13 15:34
 */
public class RuntimeUtil {

    /**
     * 执行 cmd 命令
     * @param directory 子进程工作目录
     * @param cmd cmd 命令
     * @param isWait 主进程是否等待子进程执行完毕
     * @return
     */
    public static void exec(String directory, String cmd, boolean isWait) {
        String system  = getSystemName();
        List<String> cmds = new ArrayList<>();
        // 有时候执行的命令行命令不是有效的可执行文件，而是由命令行 shell (cmd.exe) 提供的命令，代码直接执行会报错
        // 为了从其他进程运行此命令，必须启动 cmd.exe 并将参数传递给它
        // 工作目录有时候也需要指定
        if (system.contains("win")) {
            cmds.add("cmd.exe");
            cmds.add("/C");
        } else if (system.contains("linux")) {
            cmds.add("bash");
            cmds.add("-c");
        } else {
            throw new RuntimeException("未知系统");
        }
        cmds.add(cmd);
        try {
            ProcessBuilder pb = new ProcessBuilder();
            Process process = pb.directory(new File(directory)).command(cmds).start();
            if (isWait) {
                process.waitFor();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 获取当前操作系统名称
     * @return
     */
    public static String getSystemName() {
        return System.getProperty("os.name").toLowerCase();
    }
}